package course;


import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
import java.util.Scanner;

/**实例化
 * 调用方法
 * 进入课程表系统模块
 * 有登录选项
 * 有退出选项
 * "1" == str不允许
 * 输入用户名称
 * 输入密码
 * 创建新用户
 * 实例调用
 * 输入密码
 * 登录成功
 * 设置添加课程，
 * 可以添加课程号、
 * 课程名称、课程学时以及成绩
 * 设置删除课程信息
 * 输入想要删除的课程号
 * 可删除该课程
 * 设置导入课程，
 * 导入excel表中的课程
 * 输入表地址即可
 * 设置导出课程，
 * 导出数据库中的课程，
 * 输入excel表中的数值
 * 添加课程号
 * 添加课程号
 * 添加学时
 * 添加成绩
 * 删除操作
 * 删除课程
 * 导入学生信息
 *  TODO其他处理
 *  输入文件地址
 *  0返回上一级
 *  导出文件信息
 *  输入数据库中课程号
 *  即可导出课程信息
 *  查询课程信息
 *  输入课程编号
 *  查询到课程的基本信息
 *  按0返回上一级
 *  操作成功
 */

public class Menu {
    public static void main(String[] args) throws SQLException, ClassNotFoundException, IOException {


        Scanner sc = new Scanner(System.in);
        while (true) {
            // 实例化
            // TestMain4 tt = new TestMain4();
            // 调用方法
            //  tt.Time();

/**进入课程表系统模块
 * 有登录选项
 * 有退出选项
 */

            Time.main(null);
            System.out.println("---------------------------------");
            System.out.println("---------------------------------");
            System.out.println("---------课程表系统模块-------------");
            System.out.println("------------1.登录----------------");
            System.out.println("------------0.退出----------------");
            System.out.println("---------------------------------");
            System.out.println("---------------------------------");
            String str = sc.nextLine();
            if ("1".equals(str)) {
                // "1" == str不允许
/**
 * 而while循环控制变量的
 * 初始化一般放在while语句之前
 * 循环控制变量的修改一般放在循环体中
 * 形式上不如for语句简洁
 * 但它比较适用于循环次数不易预知的情况（用某一条件控制循环）
 * 当n==1时执行while循环结构里的语句
 * 当n不等于1时，则跳过该循环执行循环体外的语句。
 * while 循环的格式：while (表达式){语句；}
 * while 循环的执行顺序：
 * 当表达式为真，则执行下面的语句
 * 语句执行完之后再判断表达式是否为真
 * 如果为真，再次执行下面的语句
 * 然后再判断表达式是否为真……就这样一直循环下去
 * 直到表达式为假，跳出循环。
 */
                while (true) {
                    System.out.println("--------请输入用户名----------");
                    //输入用户名称
                    String username = sc.nextLine();
                    System.out.println("--------请输入密码-----------");
                    //输入密码
                    String password = sc.nextLine();
                    //输入密码

                    LoginDao dao = new LoginDao();
                    //创建新用户
                    List<UserPojo> ulist = dao.findByUname(username);
                    //实例调用

                    if (ulist.size() == 1) {
                        //if语句
                        if (ulist.get(0).getPassword().equals(password)) {
                            //输入密码
                            System.out.println("登录成功");
                            //登录成功
/**
 *当n==1时执行while循环结构里的语句
 * 当n不等于1时
 * 则跳过该循环执行循环体外的语句。
 * while 循环的格式
 * while (表达式){语句；}
 * while 循环的执行顺序
 * 当表达式为真，则执行下面的语句
 * 语句执行完之后再判断表达式是否为真
 * 如果为真，再次执行下面的语句
 * 然后再判断表达式是否为真……就这样一直循环下去
 * 直到表达式为假，跳出循环。
 */
                            while (true) {

                                /**设置添加课程，可以添加课程号、课程名称、课程学时以及成绩
                                 * 设置删除课程信息，输入想要删除的课程号，即可删除该课程
                                 * 设置导入课程，导入excel表中的课程，输入表地址即可
                                 * 设置导出课程，导出数据库中的课程，输入excel表中的数值
                                  */

                                System.out.println("-------1.添加课程信息------");
                                System.out.println("-------2.删除课程信息------");
                                System.out.println("-------3.导入课程信息------");
                                System.out.println("-------4.导出课程信息------");
                                System.out.println("-------5.退出------");
                                System.out.println("-------------");
                                System.out.println("-------------");
                                String str1 = sc.nextLine();
                                //基本操作
                                if ("1".equals(str1)) {
                                    System.out.println("-----添加课程信息：课程号--------");
                                    //添加课程号
                                    String v1 = sc.nextLine();
                                    System.out.println("-----添加课程信息：课程名称--------");
                                    //添加课程名称
                                    String v2 = sc.nextLine();
                                    System.out.println("-----添加课程信息：课程学时--------");
                                    //添加课程学时
                                    int v3 = Integer.parseInt(sc.nextLine());
                                    System.out.println("-----添加课程信息：课程成绩--------");
                                    //添加课程成绩
                                    int v4 = Integer.parseInt(sc.nextLine());
                                    // int 变更了几条记录
                                    int r = dao.addUserInfo(v1, v2, v3, v4);
                                    System.out.println("添加成了" + r + "条数据");
                                    //添加成功
                                }
                                //                               删除操作
                                else if ("2".equals(str1)) {
                                    deletecourse();
                                    //删除课程

                                }
//                                 导入学生信息
                                else if ("3".equals(str1)) { // TODO其他处理
                                    // TODO其他处理
                                    while (true) {
                                        //

                                        System.out.println("-----请输入文件excel--------");
                                        //输入文件地址
                                        System.out.println("-----0.返回上一级l--------");
                                        //按0返回上一级

                                        String path = sc.nextLine();
                                        //下一行
                                        if ("0".equals(path)) {
                                            break;
                                            //返回
                                        } else {
//
                                            // 文件存不存在
                                            File file = new File(path);
                                            if (!file.exists()) {
                                                // 文件不存在的话
                                                System.out.println("-----文件不存在的话--------");
                                            } else {
                                                // 读取文件
                                                if (!file.exists()) {
                                                    // 文件不存在的话
                                                    System.out.println("-----文件不存在的话--------");
                                                } else {
                                                    CourseExcel se = new CourseExcel();
                                                    List<CoursePojo> slist = se.readCourseInfo(file);
                                                    // 循环插入数据操作
                                                    // 循环插入数据操作
                                                    CourseDao studao = new CourseDao();
                                                    studao.insertAll(slist);
                                                    //创建
                                                    System.out.println("---插入成功--");
                                                    //插入成功
                                                }
                                            }
                                        }
                                    }
                                }
                                //                             导出学生信息
                                else if ("4".equals(str1))
                                /**
                                 * ...else
                                 * 也就是当条件先满足if
                                 * 如果没有满足这个条件的情况下则去判断是否满足else
                                 * 你可以理解成单项判断
                                 * 也就是“或者”的关系，
                                 * 当你判断条件的时候需要满足if或者else
                                 * 当然这里else可以有多个。
                                 */
                                {
                                    //导出4
                                    exportExcelStudent();
                                    //学生的表
                                }
                                else if ("5".equals(str1)) {
                                    //导出5
                                    return;
                                    //返回
                                }
                            }
                        } else {
                            System.out.println("用户名存在，密码不正确");
                            //用户名存在，密码不正确
                        }
                    } else {
                        System.out.println("有问题了呀！用户名不存在");
                        //有问题了呀！用户名不存在
                    }
                }

            } else if ("0".equals(str)) {
                //0返回
                System.exit(0);
                //存在0
            } else {
                System.out.println("请重新输入");
                //请重新输入
            }
        }
    }

    /**
     * public ArrayList(int initialCapacity){}
     * 给数组的长度初始化
     * 所以一般在知道数据长度的情况下最好赋固定的值
     * 以免不断扩充消耗性能
     * public ArrayList(){}
     * 平时用的最多的，默认创建长度为10的数组
     * ArrayList里面有哪些参数
     * 首先介绍下ArrayList的几个参数
     *  private static final int DEFAULT_CAPACITY = 10;
     * 这个是ArrayList初始化时如果没有为ArrayList长度赋值
     * 则创建长度为10的数组
     * @throws SQLException
     * @throws IOException
     */
    private static void exportExcelStudent() throws SQLException, IOException {
        while (true) {
            System.out.println("--------1.按课程号导出--------------");
 //           System.out.println("--------2.所有导出--------------");
            System.out.println("--------0.退出--------------");
            //按0退出
            // 监控控制台
            Scanner sc = new Scanner(System.in);
            String sel = sc.nextLine();
            if ("0".equals(sel)) {
                return;
                // 结束
            } else if ("1".equals(sel)) {
                while (true) {
                    System.out.println("--------输入课程编号--------------");
                    //输入课程编号
                    System.out.println("--------0.退出--------------");
                    //按0退出
                    CourseDao dao = new CourseDao();
                    //创建
                    String cno = sc.nextLine();
                    //下一行
                    if ("0".equals(cno)) {
                        break;
                        //返回
                    } else {
                        // 字符串转换成
  //                      int cno1 = Integer.parseInt(cno);

                        /**
                         * List是stl实现的双向链表，与向量(vectors)相比
                         * 它允许快速的插入和删除，但是随机访问却比较慢
                         * 使用时需要添加头文件
                         * #include
                         * listlst1;          //创建空list
                         *
                         * list lst2(5);       //创建含有5个元素的list
                         *
                         * listlst3(3,2);  //创建含有3个元素的list
                         * listlst4(lst2);    //使用lst2初始化lst4
                         * listlst5(lst2.begin(),lst2.end());  //同lst4
                         * Lst1.assign() 给ist赋值
                         * Lst1.back() 返回最后一个元素
                         *
                         * Lst1.begin() 返回指向第一个元素的迭代器
                         *
                         * Lst1.clear() 删除所有元素
                         *
                         * Lst1.empty() 如果list是空的则返回true
                         *
                         * Lst1.end() 返回末尾的迭代器
                         *
                         * Lst1.erase() 删除一个元素
                         *
                         * Lst1.front() 返回第一个元素
                         *
                         * Lst1.get_allocator() 返回list的配置器
                         *
                         * Lst1.insert() 插入一个元素到list中
                         *
                         * Lst1.max_size() 返回list能容纳的最大元素数量
                         *
                         * Lst1.merge() 合并两个list
                         *
                         * Lst1.pop_back() 删除最后一个元素
                         *
                         * Lst1.pop_front() 删除第一个元素
                         *
                         * Lst1.push_back() 在list的末尾添加一个元素
                         *
                         * Lst1.push_front() 在list的头部添加一个元素
                         *
                         * Lst1.rbegin() 返回指向第一个元素的逆向迭代器
                         *
                         * Lst1.remove() 从list删除元素
                         *
                         * Lst1.remove_if() 按指定条件删除元素
                         *
                         * Lst1.rend() 指向list末尾的逆向迭代器
                         *
                         * Lst1.resize() 改变list的大小
                         *
                         * Lst1.reverse() 把list的元素倒转
                         *
                         * Lst1.size() 返回list中的元素个数
                         *
                         * Lst1.sort() 给list排序
                         *
                         * Lst1.splice() 合并两个list
                         *
                         * Lst1.swap() 交换两个list
                         *
                         * Lst1.unique() 删除list中重复的元素
                         */
                        List<CoursePojo> slist = dao.findCourseClassByCid(cno);
//                        for (int i = 0; i < slist.size(); i++) {
//                            System.out.println(slist.get(i).getCid() + "@" + slist.get(i).getSname());
//                        }
                        if (slist.size() == 0) {
                            // 没有信息
                            System.out.println("没有信息");
                            continue;
                        } else {
                            System.out.println("--------输入导出的地址--------------");
                            //输入导出地址
                            String filepath = sc.nextLine();
                            CourseExcel excele = new CourseExcel();
                            // 根据 文件路径和 集合 组装导出
                            excele.exportto(filepath, slist);
                            System.out.println("导出成功！");
                            //导出成功
                        }
                    }
                }


            } else {
                // 其他处理
                // TODO


            }
        }

    }

    /**
     * 删除学生的操作
     */

    /**
     * 另外一种作用就是像正常函数方法一样调用其函数
     * 但是需要注意的一点就是static声明的变量或者方法
     * 是类方法或者说是类变量
     * 不需要实例化就可以直接使用
     * public关键字
     * 这个好理解
     * 声明主函数为public就是告诉其他的类可以访问这个函数。
     * static关键字
     * 告知编译器main方法是一个静态方法
     * 也就是说main方法中的代码是存储在静态存储区（方法区）的
     * 即当定义了类以后这段代码就已经存在了
     * 只要类被加载后，就可以使用该方法
     * 不需要通过实例化来访问
     * 可直接通过类名.main()直接访问。
     * void关键字表明main()的返回值是无类型。
     * main是jvm识别的特殊方法名，是程序的入口方法。
     * 同一个.java文件可以有多个main方法
     * 但只有与文件名相同的用public修饰的类中的main()方法才能作为整个程序的入口方法
     * @throws SQLException
     */
    public static void deletecourse() throws SQLException {
        while (true) {
            //循环语句正确
            System.out.println("--------请输入课程号--------------");
            //输入课程号
            System.out.println("--------0.退出--------------");
            //按0退出

            // 监控控制台
            Scanner sc = new Scanner(System.in);
            String cno = sc.nextLine();
            //下一行
            if ("0".equals(cno)) {
                return;
                // 结束
            } else {
                // 数据的操作
                CourseDao dao = new CourseDao();
                int r = dao.deleteByCno(cno);
               // 删除
                if (r == 0) {
                    //if语句
                    System.out.println("课程号不存在");
                    //课程号不存在
                } else {
                    System.out.println("删除成功" + r + "条");
                    //删除成功
                }
            }
        }
    }

}



